---@diagnostic disable: lowercase-global, undefined-global, trailing-space

---@class api_diving # 潜水交互 API
local dst_lan = {}

---创建潜水动作
---@param data_tbl data_diving[]
function dst_lan:CreateDivingActions(data_tbl)
    for _, data in ipairs(data_tbl) do
        -- 创建"跃入"动作
        local dive_in_action = AddAction(data.action_dive_in, data.str_dive_in or "跃入", function(act)
            local doer = act.doer
            local target = act.target
            
            if doer and target and doer.components.mod_pono_diving then
                return doer.components.mod_pono_diving:DiveIntoPond(target)
            end
        end)
        
        -- 创建"跃出"动作
        local dive_out_action = AddAction(data.action_dive_out, data.str_dive_out or "跃出", function(act)
            local doer = act.doer
            local target = act.target
            
            if doer and doer.components.mod_pono_diving then
                return doer.components.mod_pono_diving:DiveOutOfPond()
            end
        end)
        
        -- 注册状态图动作处理器
        AddStategraphActionHandler("wilson", ActionHandler(dive_in_action, data.state_dive_in or "doshortaction"))
        AddStategraphActionHandler("wilson_client", ActionHandler(dive_in_action, data.state_dive_in or "doshortaction"))
        
        AddStategraphActionHandler("wilson", ActionHandler(dive_out_action, data.state_dive_out or "doshortaction"))
        AddStategraphActionHandler("wilson_client", ActionHandler(dive_out_action, data.state_dive_out or "doshortaction"))
        
        -- 添加SCENE类型的ComponentAction - 用于池塘交互
        AddComponentAction("SCENE", "pono_pond_interaction", function(inst, doer, actions, right)
            -- 只对Pono角色生效
            if not (doer and doer:HasTag("pono")) then
                return
            end
            
            -- 检查目标是否是池塘
            if not inst:HasTag("pono_pond") then
                return
            end
            
            -- 获取diving组件（服务器端用components，客户端用replica）
            local diving_comp = doer.replica.mod_pono_diving or doer.components.mod_pono_diving
            if not diving_comp then
                return
            end
            
            local is_diving = diving_comp:IsDiving()
            
            -- 根据角色状态添加相应的动作
            if is_diving then
                -- 如果在潜水中，检查是否可以跃出（2秒后才能跃出）
                if inst:HasTag("pono_pond_occupied") and doer:HasTag("pono_can_dive_out") then
                    table.insert(actions, GLOBAL.ACTIONS[string.upper(data.action_dive_out)])
                end
            else
                -- 如果不在潜水中，可以与未被占用的池塘交互（显示"跃入"）
                if not inst:HasTag("pono_pond_occupied") then
                    -- 检查温泉是否敲掉了结晶（变冷的温泉不显示跃入选项）
                    if inst.prefab == "hotspring" and inst:HasTag("pono_cold_spring") then
                        -- 不添加跃入动作（阻止显示跃入选项）
                    else
                        table.insert(actions, GLOBAL.ACTIONS[string.upper(data.action_dive_in)])
                    end
                end
            end
        end)
    end
end

---给池塘添加必要的标签和组件
function dst_lan:SetupPonds()
    -- 给所有池塘/可潜水水体添加标签和组件
    -- 包括: 池塘、洞穴池塘、沼泽池塘、绿洲湖泊、温泉
    local pond_prefabs = {"pond", "pond_cave", "pond_mos", "oasislake", "hotspring"}
    
    for _, prefab in ipairs(pond_prefabs) do
        AddPrefabPostInit(prefab, function(inst)
            -- 添加池塘/水体标签
            inst:AddTag("pono_pond")
            if prefab == "oasislake" then
                inst:AddTag("pono_largepond") -- 大型水体标记（仅绿洲湖泊）
            end
            
            -- 服务器端添加交互组件
            if GLOBAL.TheWorld.ismastersim then
                -- 添加一个空组件用于ComponentAction识别
                if not inst.components.pono_pond_interaction then
                    inst:AddComponent("pono_pond_interaction")
                end
                
                -- 温泉特殊处理：监听状态变化并添加标签
                if prefab == "hotspring" then
                    -- 定期检查温泉状态并添加相应标签
                    inst:DoPeriodicTask(1, function()
                        -- 检查是否敲掉结晶（exothermic变为false）
                        local is_cold = inst.components.heater and inst.components.heater.exothermic == false
                        
                        if is_cold then
                            -- 敲掉结晶后的温泉：添加标签阻止跃入
                            if not inst:HasTag("pono_cold_spring") then
                                inst:AddTag("pono_cold_spring")
                            end
                        else
                            -- 恢复正常：移除标签
                            if inst:HasTag("pono_cold_spring") then
                                inst:RemoveTag("pono_cold_spring")
                            end
                        end
                    end)
                end
            end
        end)
    end
end

---主函数
---@param data_tbl data_diving[]
function dst_lan:main(data_tbl)
    self:CreateDivingActions(data_tbl)
    self:SetupPonds()
end

return dst_lan
